package main

import (
	"encoding/json"
	"fmt"
	"github.com/gin-gonic/gin"
	// 导入依赖前边添加一个下划线，表示只执行里面init方法，不会导入里面的变量或其他方法
	_ "github.com/go-sql-driver/mysql"
	"github.com/theorydance/go-second/routers"
	"net/http"
)

// 自定义Go中间件（类似于java中的拦截器）
func myHandler() gin.HandlerFunc {
	return func(context *gin.Context) {
		// 通过自定义的中间件，设置的值，在后续处理中只要调用了这个中间件的都可以拿到这里的参数
		context.Set("usersession", "userid-1")
		context.Next() // 放行
		// context.Abort() // 阻断
	}
}

// main方法，必须在package main包内
func main() {

	// 创建一个服务
	ginServer := gin.Default()
	ginServer.Use(myHandler())
	//ginServer.Use(favicon.New("./favicon.ico"))

	// 导入并使用其他路由文件，将接口按照文件进行分开写，这里进行拼接起来
	routers.InitUserRouter(ginServer)

	// 加载静态页面
	ginServer.LoadHTMLGlob("templates/*")
	// 设置静态资源
	ginServer.Static("/static", "./static")

	// 响应一个json数据给调用者 这第二个参数，可以不要，
	// 要就是使用指定的中间件，如果所有路由中都没有指定过中间件，就会使用全局的中间件
	ginServer.GET("/hello", myHandler(), func(context *gin.Context) {

		// 通过MustGet从获取中间件中设置的数据
		usersession := context.MustGet("usersession").(string)
		fmt.Println("usersession = " + usersession)

		// 响应json数据方式
		context.JSON(http.StatusOK, gin.H{"msg": "hello, world!"})
	})

	// 响应一个页面给前端
	ginServer.GET("/index", func(context *gin.Context) {
		context.HTML(http.StatusOK, "index.html", gin.H{
			"msg": "这是go后台传递的数据",
		})
	})

	// 参数传递

	// 方式三：json
	ginServer.POST("/json", func(context *gin.Context) {
		// json采用GetRawData获取body中的数据
		bytes, _ := context.GetRawData()
		var m map[string]interface{}
		_ = json.Unmarshal(bytes, &m)
		m["hello"] = "world"
		context.JSON(http.StatusOK, m)
	})

	// 方式四：表单
	ginServer.POST("/user/add", func(context *gin.Context) {
		// 表单采用PostForm获取数据
		username := context.PostForm("username")
		password := context.PostForm("password")
		context.JSON(http.StatusOK, gin.H{
			"msg":      "ok",
			"username": username,
			"password": password,
		})
	})

	// 路由重定向
	ginServer.GET("/test", func(context *gin.Context) {
		context.Redirect(http.StatusMovedPermanently, "https://www.baidu.com/")
	})

	// 404 NotRoute
	ginServer.NoRoute(func(context *gin.Context) {
		// 页面存放在templates/404.html
		context.HTML(http.StatusNotFound, "404.html", nil)
	})

	// 路由组
	menuGroup := ginServer.Group("/menu")
	{
		// 访问路径为组路径加子路径  /menu/list
		menuGroup.GET("/list", func(context *gin.Context) {

		})
		menuGroup.GET("/one", func(context *gin.Context) {

		})
		menuGroup.POST("/update", func(context *gin.Context) {

		})
	}

	// 服务端口
	ginServer.Run(":8082")

}
